package com.wsg.dep.util;

import sun.misc.Unsafe;

import java.lang.reflect.Field;
import java.security.AccessController;
import java.security.PrivilegedExceptionAction;

/**
 * 不安全的低级API访问工具
 */
public class UnSafeUtil {
    /**
     * Unsafe类提供了一些低级别操作，如直接内存访问、CAS操作等，用于实现高性能的并发算法。
     */
    private static final Unsafe THE_UNSAFE;

    /**
     * 静态代码块在类被加载时执行，并且只会执行一次。
     */
    static {
        try {
            final PrivilegedExceptionAction<Unsafe> action = new PrivilegedExceptionAction<Unsafe>() {
                public Unsafe run() throws Exception {
                    // 通过反射获取Unsafe类中名为theUnsafe 的私有字段，这个字段是Unsafe类的单例实例。
                    Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");
                    // 将该私有字段的可访问性设置为true，这样就可以绕过Java的访问控制机制来访问该字段。
                    theUnsafe.setAccessible(true);
                    // 获取theUnsafe字段的值。由于theUnsafe是静态字段，所以传入null作为对象引用，并将结果强制转换为Unsafe类型返回。
                    return (Unsafe) theUnsafe.get(null);
                }
            };

            // 用于在特权上下文中执行指定的PrivilegedExceptionAction操作。通过这种方式，可以确保代码在执行反射操作时具有足够的权限。
            THE_UNSAFE = AccessController.doPrivileged(action);
        } catch (Exception e) {
            throw new RuntimeException("Unable to load unsafe", e);
        }
    }

    /**
     * 获取初始化好的单例Unsafe
     * Unsafe类提供了一些低级别操作，如直接内存访问、CAS操作等，用于实现高性能的并发算法。
     * @return
     */
    public static Unsafe getUnsafe()
    {
        return THE_UNSAFE;
    }
}
